/**
 * 播种任务分发服务，定时查询数据库中任务，并分发给机械臂执行。
 * 分发逻辑（持续更新）：
 * 1、服务开启
 * 2、查询是否有正在进行的播种任务，如果有则等待步骤5响应；没有则进行下一步
 * 3、查询数据库中未开始的任务（暂时只执行当天的任务）
 * 4、使用websocket进行广播任务，并等待确认信息。10秒后如果未收到确认信息，则回到第二步开始
 * 5、websocket收到商品分拣数量提交后，查询当前播种任务单是否都已分拣完成。如果完成则回到第二步；如果未完成，继续等待分拣数量提交
 */

const db = require('../../sql/basicConnection')
let sowTaskInterval = null // 播种任务interval
const sowTaskIntervalTime = 5*1000 // 播种监测循环时间

// 获取当天未执行的任务
const getWaitingTasks = () =>{
    const sql = `SELECT * FROM sow_task WHERE status=0 AND TO_DAYS(create_time) = TO_DAYS(NOW()) ORDER BY create_time`
    return db.query(sql)
}

// 播种任务中，是否有正在进行的播种任务
const isSowingTask = async (taskId) =>{
    const sql = `SELECT * FROM sow_task WHERE status=0 AND TO_DAYS(create_time) = TO_DAYS(NOW())`
    const list = await db.query(sql)
    return list.length > 0
}

// 查询当前播种任务中的所有播种任务项是否已完成
const isSowTaskAllFinished = async (taskId) =>{
    const listSql = `SELECT * FROM sow_task_item WHERE sow_task_id='${taskId}'`
    const list = await db.query(listSql)
    const completedListSql = `SELECT * FROM sow_task_item WHERE sow_task_id='${taskId}' AND pick_unit_total_count = unit_total_count`
    const completedList = await db.query(completedListSql)
    return list.length === completedList.length
}

const startSowTaskDistributeServer = () =>{
    if(sowTaskInterval){
        clearInterval(sowTaskInterval)
        sowTaskInterval = null
    }
    sowTaskInterval = setInterval(() =>{
        isSowingTask().then((isSowingTask) =>{
            if(isSowingTask){
                console.log('有正在进行的播种任务，继续等待回应...')
            }else {
                getWaitingTasks().then((tasks) => {
                    if (tasks && tasks.length > 0) {
                        const taskId = tasks[0].id
                        console.log(`开始分发任务：${taskId}`)
                        // TODO: 广播任务并等待确认
                        // websocket broadcast(JSON.stringify({taskId, status:'waiting'}))
                        // setTimeout(()=>{
                        //     if(!isSowTaskAllFinished(taskId)){
                        //         console.log('播种任务中有未完成的任务项，请稍后...')
                        //     }else{
                        //         console.log('播种任务已完成，开始执行...')
                        //         // 执行播种任务
                        //         // TODO: 执行播种任务
                        //         websocket broadcast(JSON.stringify({taskId, status:'finished'}))
                        //     }
                        // },10000)
                    } else {
                        console.log('暂时无可执行的任务...')
                    }
                })
            }
        })
    },sowTaskIntervalTime)
}


